package initialize

import (
	"common/config"
	"encoding/json"
	"fmt"
	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/nacos-group/nacos-sdk-go/vo"
)

type Nachos struct {
	Mysql struct {
		User     string `json:"user"`
		Password string `json:"password"`
		Host     string `json:"host"`
		Port     int    `json:"port"`
		Database string `json:"database"`
	} `json:"mysql"`
	Redis struct {
		Addr     string `json:"addr"`
		Password string `json:"password"`
		Db       int    `json:"db"`
	} `json:"redis"`
	Aliyun struct {
		AccessKeyID     string `json:"AccessKeyID"`
		AccessKeySecret string `json:"AccessKeySecret"`
		Bucket          string `json:"bucket"`
	} `json:"aliyun"`
	Alipay struct {
		PrivateKey string `json:"privateKey"`
		AppId      string `json:"appId"`
		NotifyURL  string `json:"NotifyURL"`
		ReturnURL  string `json:"ReturnURL"`
	} `json:"alipay"`
	Es struct {
		Addr string `json:"addr"`
	} `json:"Es"`
	Mongodb struct {
		User     string `json:"user"`
		Passwd   string `json:"passwd"`
		Hort     string `json:"Hort"`
		Port     int    `json:"port"`
		Database string `json:"Database"`
	} `json:"mongodb"`
	Txy struct {
		AccessKeyID     string `json:"AccessKeyID"`
		AccessKeySecret string `json:"AccessKeySecret"`
	} `json:"txy"`
	GaoDe struct {
		Key string `json:"key"`
	} `json:"gaoDe"`
	Mqtt struct {
		Broker   string `json:"Broker"`
		ClientID string `json:"ClientID"`
		Username string `json:"Username"`
		Password string `json:"Password"`
	} `json:"mqtt"`
}
type UpdateConfig func()

var Config Nachos

func InitNachos(u UpdateConfig) {
	cf := config.ViperData.Nachos
	clientConfig := constant.ClientConfig{
		NamespaceId:         cf.NamespaceId, // 如果需要支持多namespace，我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时，此处填空字符串。
		TimeoutMs:           5000,
		NotLoadCacheAtStart: true,
		LogDir:              "/tmp/nacos/log",
		CacheDir:            "/tmp/nacos/cache",
		LogLevel:            "debug",
	}
	serverConfigs := []constant.ServerConfig{
		{
			IpAddr:      cf.IpAddr,
			ContextPath: "/nacos",
			Port:        uint64(cf.Port),
			Scheme:      "http",
		},
	}
	client, err := clients.CreateConfigClient(map[string]interface{}{
		"serverConfigs": serverConfigs,
		"clientConfig":  clientConfig,
	})
	if err != nil {
		panic(err)
	}
	content, err := client.GetConfig(vo.ConfigParam{
		DataId: cf.DataId,
		Group:  cf.Group,
	})
	err = json.Unmarshal([]byte(content), &Config)
	if err != nil {
		panic(err)
	}
	err = client.ListenConfig(vo.ConfigParam{
		DataId: cf.DataId,
		Group:  cf.Group,
		OnChange: func(namespace, group, dataId, data string) {
			err = json.Unmarshal([]byte(data), &Config)
			if err != nil {
				panic(err)
			}
			if u != nil {
				u()
			}
		},
	})
	if err != nil {
		panic(err)
	}
	fmt.Println("init nachos success")
}
